/**
 * @fileOverview 补间动画方式工具
 * 
 * @version qinglan_animate 1.0
 * @static
 * @author wxq wxqqh@qq.com
 * 
 * @see http://www.cnblogs.com/cloudgamer/archive/2009/01/06/Tween.html  author cloudgamer
 */
/**
 * 命名空间
 * 
 * @namespace
 * @type Object
 */
window.qinglan = window.qinglan || {};
/**
 * 补间动画命名空间
 * 
 * @namespace
 * @type Object
 */
qinglan.Tween = qinglan.Tween || {};
/**
 * 一次线性方程 ( t )
 * 
 * @namespace
 * @type Object
 */
qinglan.Tween.Linear = qinglan.Tween.Linear || {};
/**
 * 一次线性方程正常模式
 * 
 * <pre>
 * 		c * t / d + b
 * </pre>
 * 
 * @param {Number}
 *            t 时间片，当前时间
 * @param {Number}
 *            b 开始值
 * @param {Number}
 *            c 变化值
 * @param {Number}
 *            d 持续时间
 * @return {Number} 当前计算值
 * 
 */
qinglan.Tween.Linear.normal = function(t, b, c, d) {
	return c * t / d + b;
};
/**
 * 二次线性方程 ( t ^ 2 )
 * 
 * @namespace
 * @type Object
 */
qinglan.Tween.Quadratic = qinglan.Tween.Quadratic || {};
/**
 * 二次线性方程  从0开始加速的缓动
 * 
 * <pre>
 * 		c * ( t /= d ) * t + b
 * </pre>
 * 
 * @param {Number}
 *            t 时间片，当前时间
 * @param {Number}
 *            b 开始值
 * @param {Number}
 *            c 变化值
 * @param {Number}
 *            d 持续时间
 * @return {Number} 当前计算值
 * 
 */
qinglan.Tween.Quadratic.easeIn = function(t, b, c, d) {
	return c * ( t /= d ) * t + b;
};
/**
 * 二次线性方程  减速到0的缓动
 * 
 * <pre>
 * 		- c * ( t /= d ) * ( t - 2 ) + b
 * </pre>
 * 
 * @param {Number}
 *            t 时间片，当前时间
 * @param {Number}
 *            b 开始值
 * @param {Number}
 *            c 变化值
 * @param {Number}
 *            d 持续时间
 * @return {Number} 当前计算值
 * 
 */
qinglan.Tween.Quadratic.easeOut = function(t, b, c, d) {
	return - c * ( t /= d ) * ( t - 2 ) + b; 
};
/**
 * 二次线性方程  前半段从0开始加速，后半段减速到0的缓动
 * 
 * <pre>
 * 		( t /= d / 2 < 1 ) ? ( c / 2 * Math.pow( t, 2 ) + b ) : ( - c /2 * ( ( -- t ) * ( t - 2 ) - 1) + b )
 * </pre>
 * 
 * @param {Number}
 *            t 时间片，当前时间
 * @param {Number}
 *            b 开始值
 * @param {Number}
 *            c 变化值
 * @param {Number}
 *            d 持续时间
 * @return {Number} 当前计算值
 * 
 */
qinglan.Tween.Quadratic.easeInOut = function (t, b, c, d) {
	return  ( (t /= d / 2) < 1 ) ? ( c / 2 * Math.pow( t, 2 ) + b ) : ( - c /2 * ( ( -- t ) * ( t - 2 ) - 1) + b );
};
/**
 * 三次线性方程  ( t ^ 3  )
 * 
 * @namespace
 * @type Object
 */
qinglan.Tween.Cubic = qinglan.Tween.Cubic || {}; 
/**
 * 三次线性方程  从0开始加速的缓动
 * 
 * <pre>
 * 		c * ( t /= d ) * Math.pow( t, 2 ) + b
 * </pre>
 * 
 * @param {Number}
 *            t 时间片，当前时间
 * @param {Number}
 *            b 开始值
 * @param {Number}
 *            c 变化值
 * @param {Number}
 *            d 持续时间
 * @return {Number} 当前计算值
 * 
 */
qinglan.Tween.Cubic.easeIn = function (t, b, c, d) {
	return c * ( t /= d ) * Math.pow( t, 2 ) + b;
};
/**
 * 三次线性方程  减速到0的缓动
 * 
 * <pre>
 * 		- c * ( t /= d ) * ( t - 2 ) + b
 * </pre>
 * 
 * @param {Number}
 *            t 时间片，当前时间
 * @param {Number}
 *            b 开始值
 * @param {Number}
 *            c 变化值
 * @param {Number}
 *            d 持续时间
 * @return {Number} 当前计算值
 * 
 */
qinglan.Tween.Cubic.easeOut = function (t, b, c, d) {
	return c * ( ( t = t / d - 1 ) * Math.pow(t, 2) + 1) +b; 
};
/**
 * 三次线性方程  前半段从0开始加速，后半段减速到0的缓动
 * 
 * <pre>
 * 		 (t /= d /2 <1 ) ? ( c / 2 * Math.pow(t, 3) + b ) : ( c / 2 * ( ( t -=2  ) * Math.pow(t, 2) + 2 ) + b )
 * </pre>
 * 
 * @param {Number}
 *            t 时间片，当前时间
 * @param {Number}
 *            b 开始值
 * @param {Number}
 *            c 变化值
 * @param {Number}
 *            d 持续时间
 * @return {Number} 当前计算值
 * 
 */
qinglan.Tween.Cubic.easeInOut = function(t, b, c, d) {
	return ((t /= d / 2) <1 ) ? ( c / 2 * Math.pow(t, 3) + b ) : ( c / 2 * ( ( t -=2  ) * Math.pow(t, 2) + 2 ) + b );
};
